package com.csx.base.design.behavior.chainOfResponsibility.example.exampleA.handler;


import com.csx.base.design.behavior.chainOfResponsibility.example.exampleA.config.ProductCheckHandlerConfig;
import com.csx.base.design.behavior.chainOfResponsibility.example.exampleA.model.vo.ProductVO;
import com.csx.base.design.behavior.chainOfResponsibility.example.exampleA.model.vo.Result;
import lombok.Getter;
import lombok.Setter;

import java.util.Objects;

/**
 * @author cuisongxu
 * @date 2022/12/28 12:37
 */
public abstract class AbstractCheckHandler {

    /**
     * 当前处理器持有下一个处理器的引用
     *  如果当前处理器 handle() 校验方法执行完毕，则执行 nextHandler.handle()
     */
    @Getter
    @Setter
    protected AbstractCheckHandler nextHandler;

    /**
     * 处理器配置
     * 表示每个处理器的动态配置类，可以通过 配置中心 动态修改该配置，实现处理器的
     *  “动态编排” 和 "顺序控制"。 配置类中可以配置 处理器的名称、下一个处理器、处理器是否降级等属性
     */
    @Setter
    @Getter
    protected ProductCheckHandlerConfig config;


    /**
     * 处理器执行方法
     * 实际上是抽象出的校验方法，每个处理器都需要继承该类，并重写handle方法，从而实现各自的校验逻辑
     * TODO 抽象参数类型，利用类上的泛型,子类做具体类型的校验
     * @param param 校验的参数
     * @return 校验结果
     */
    public abstract Result handle(ProductVO param);


    /**
     * 链路传递
     * @param param
     * @return
     */
    protected Result next(ProductVO param) {

        // 下一个链路没有处理器，直接返回
        if(Objects.isNull(nextHandler)) {
            return Result.success();
        }

        // 执行下一个处理器
        return nextHandler.handle(param);
    }
}
